在程式的設計過程中,我們常常會需要用到日期的運算,有時候為了做日期的判斷,可能會需要知道每個月的最後一天是什麼時候。
這有很困難嗎?除了二月比較特殊,其他月份不都很固定?
是的,二月確實是很特殊的,因為有閏年。而閏年的算法,您還記得嗎?
以下,我們先來示範一種寫法。(當然像 Java 內建萬年曆 Calendar 這個 Class,已經有提供這個機制)
我們用 VB 的例子來說明:
dim lastday as String
dim yy as string, mm as string
yy=Year(Now)
mm=Month(Now)
select case mm
case 1,3,5,7,8,10,12
lastday = Format(Now,"yyyy/MM") + "/31"
case 4,6,9,11
lastday = Format(Now,"yyyy/MM") + "/30"
case 2
lastday = Format(Now,"yyyy/MM") + _
iif((yy mod 400) or _
(yy mod 4 and not (yy mod 100)),"/29","/28)
end select
這樣寫,其實已經很精簡了,很多時候,會看到有人用 If ElseIf,一次寫 12 個月的判斷,然後二月又針對閏年的判斷,寫了一長串的程式,也不用 Format,針對日期的格式使用類似 Cstr(yy)+"/"+Cstr(mm)+"/31" 然後小於 10 月份的還要特別注意 Cstr(yy)+"/0"+Cstr(mm)+"/31" 一看到就媽媽咪呀!心中咒念四起!當然,這樣寫沒有錯,但是不夠簡潔。
閏年是常常會出錯的地方,因為一般只記得 4 年一閏,忘了逢百不閏,逢四百才閏。
只是這樣是最好的處理方式嗎?程式寫出來就滿足了?有沒有更快、更簡潔的方法?
我們得換個角度思考,不要從字面的意思去想解答,換個方式想。
每個月的最後一天,等同於什麼?
下個月的第一天減一天
YES!這是一個通則,而且每個月都適用!不用管二月,不用處理閏年!
程式碼,需借助一下日期函數:
dim lastday as String
lastday = Format(Dateadd("d",-1,CDate(Format(Dateadd("m",1,Now),"yyyy/MM/01"))),"yyyy/MM/dd")
一行程式就可以搞定的事情,就不要使用一大堆判斷式來建構他。
舉這個例子,不是要說明寫程式要有很高超的技巧。而是,思考的方式。轉個彎,可以發現更好的作法,這才是學習程式的最重要的地方。可以藉由演算法的涉略或邏輯的訓練來加強自己的邏輯思考能力(解數學題是一種不錯的訓練方式)。訓練是可以隨時隨地做的,例如搭捷運,就可以像 antijava 大一樣,去思考站名的命名方式與系統分析方法,這些都是可以在日常生活中,潛移默化的,而且不用花一毛錢。
另外就是,要搞懂程式語言本身有提供哪些內建的函數可以幫助我們在程式的撰寫,不要什麼事情都自己做,浪費時間,也浪費資源(資源不用也是一種浪費)。
大大說的那個使用 If ElseIf 然後一次寫 12 個月的判斷的人就是我..........冏
不過看過大大的文章,我的經驗值又提升拉,感謝。
那是玩笑話,請別介意 ^^
如果是我
我會把今天前後50年的平閏年天數寫成表
然後查表
這樣 夠混了吧 ^_^